package com.ruoyi.framework.mybatisplus.strategy;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import com.ruoyi.framework.mybatisplus.OperateSymbol;
import com.ruoyi.framework.mybatisplus.QueryFieldUtil;


import java.lang.reflect.Field;

/**
 * 查询策略抽象基类
 * 提供了查询策略的通用实现，包括字段名处理、值获取和验证等功能
 * 所有具体的查询策略类都应该继承此类
 * 
 * @author xuzhen97
 */
public abstract class AbstractQueryStrategy implements QueryStrategy {
    /**
     * 操作符枚举，用于标识策略类型
     */
    protected final OperateSymbol operateSymbol;

    /**
     * 构造函数
     * @param operateSymbol 操作符枚举，用于标识策略类型
     */
    protected AbstractQueryStrategy(OperateSymbol operateSymbol) {
        this.operateSymbol = operateSymbol;
    }

    /**
     * 检查字段名是否匹配此策略
     * 通过检查字段名是否以操作符的值结尾来判断
     * 
     * @param fieldName 字段名
     * @return 如果字段名以操作符的值结尾则返回true
     */
    @Override
    public boolean matches(String fieldName) {
        return fieldName.endsWith(operateSymbol.getValue());
    }

    /**
     * 获取字段名
     * 使用QueryFieldUtil工具类处理字段名
     * 
     * @param key 原始字段名
     * @param field 字段对象
     * @return 处理后的字段名
     */
    protected String getFieldName(String key, Field field) {
        int index = key.lastIndexOf(operateSymbol.getValue());
        String original = index != -1 ? key.substring(0, index) : key;
        return QueryFieldUtil.getFieldName(field, original);
    }

    /**
     * 获取字段值
     * 使用反射获取对象中指定字段的值
     * 
     * @param obj 对象实例
     * @param field 字段对象
     * @return 字段值
     */
    protected Object getValue(Object obj, Field field) {
        return ReflectUtil.getFieldValue(obj, field);
    }

    /**
     * 验证字段值是否有效
     * 检查值是否非空
     * 
     * @param value 要验证的值
     * @return 如果值非空则返回true
     */
    protected boolean isValidValue(Object value) {
        return ObjectUtil.isNotEmpty(value);
    }
} 